﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using CapturarObjetos.Nucleo;

namespace CapturarObjetos
{
    public class Jogador : ObjetoJogo
    {
        public float DirecaoFrontal { get; set; }
        public int AlcanceMaximo { get; set; }
       
        public float velocidadeAtual;
        public const float Velocidade = 0.75f;
        public const float VelocidadeDeCurva = 0.025f;
        public float velocidadeLateral;
        public static List<Jogador> listaJogadores = new List<Jogador>();

        public Jogador(ContentManager Content, string _modelo)
            : base()
        {
            Modelo = Content.Load<Model>(_modelo);
            DirecaoFrontal = 0.0f;
            AlcanceMaximo = 100;
            Jogador.listaJogadores.Add(this);
            velocidadeAtual = 0;
            velocidadeLateral = .5f;
        }
        
        public void Update(GameTime gameTime, KeyboardState teclado_atual, KeyboardState teclado_anterior, Boolean leftKey, Boolean rightKey)
        {
            //preciso testar *primeiro* se a posição futura é válida para não travar, por isso a guardo...
            Vector3 posicaoFutura = Posicao;
            
            //estas duas variáveis temporárias servem para o giro e o movimento
            float quantoVirar = 0;
            Vector3 movimento = Vector3.Zero;
           
            if (leftKey && PosicaoX >= -13.5)
            {movimento.X = -.5f;}
            if (rightKey && PosicaoX <= 13.5)
            {movimento.X = .5f;}


            DirecaoFrontal += quantoVirar * VelocidadeDeCurva; // pra onde ele vai virar é corrigido pela velocidade de giro
            RotacaoY = DirecaoFrontal; //isto está aqui apenas pq esta variável tem outro nome na hora de desenhar...
            Matrix matrixOrientacao = Matrix.CreateRotationY(DirecaoFrontal); //preciso girar meu objeto naquela direção antes de andar
            Vector3 velocidade = Vector3.Transform(movimento, matrixOrientacao); //ando com ele aquela quantidade de movimento naquela direcao de orientacao
            velocidade *= Velocidade; //corrijo pela escala da velocidade
            posicaoFutura = Posicao + velocidade; //agora sim esta será a nova posicao do objeto

            Posicao = posicaoFutura;
        }

        public void UpdateWithInterface(Vector3 movimento)
        {
           Posicao += movimento;
        }

        private bool ManterNoTabuleiro(Vector3 posicaoFutura)
        {
            if ((Math.Abs(posicaoFutura.X) > AlcanceMaximo) ||
                (Math.Abs(posicaoFutura.Z) > AlcanceMaximo))
                return false;
            return true;
        }
        
    }
}
